class_name TileHighlighter
extends Node
## 版本：1.0.0
## 功能：TileMapLayer 高亮瓦片
## 使用：挂载到 Node 节点上，配置导出变量。

#region Exported parameters
## 是否禁用瓦片高亮功能
@export var enabled: bool = false : set = _set_enabled

## 高亮层，即将高亮瓦片绘制到该层上
@export var highlight_layer: TileMapLayer

## 高亮瓦片所在的 TileSet
@export var highlight_tile_set: TileSet

## 高亮瓦片在 TileSet 中的坐标
@export var highlight_tile_position: Vector2i
#endregion

#region Internal parameters
## 需要被高光的瓦片坐标
var cell_positions: Array[Vector2i]
#endregion


func _process(_delta: float) -> void:
	if not enabled:
		return

	_update_tiles()


## 高亮指定世界全局坐标的瓦片
func highlight_tile_from_world_global_position(world_global_position: Vector2) -> void:
	highlight_tile_from_cell_local_position(highlight_layer.local_to_map(world_global_position))


## 高亮指定网格局部坐标的瓦片
func highlight_tile_from_cell_local_position(cell_local_position: Vector2i) -> void:
	if not cell_positions.has(cell_local_position):
		cell_positions.append(cell_local_position)


## 清除所有高亮瓦片
func clear_highlighted_tiles() -> void:
	cell_positions.resize(0)


func _update_tiles() -> void:
	highlight_layer.clear()
	
	var source_id = highlight_tile_set.get_source_id(0)
	for cell_position in cell_positions:
		highlight_layer.set_cell(cell_position, source_id, highlight_tile_position)
	
	cell_positions.resize(0)


func _set_enabled(value: bool) -> void:
	enabled = value
	
	if not enabled:
		cell_positions.resize(0)
		highlight_layer.clear()
